package model;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Collection;
import java.util.LinkedList;

public class Film extends Model {
	private long id;

	public long getId() {
		return id;
	}

	public void delete() throws SQLException{
		PreparedStatement p = getConnection().prepareStatement(
				"delete from Film where id = ?");
		p.setLong(1,id);
		p.executeUpdate();
		p.close();
	}	
	public Collection<Recenzja> getRecenzje() throws SQLException
	{
		PreparedStatement p = getConnection().prepareStatement( "select id from RECENZJA where film_id  = ? ");
		p.setLong( 1, id );
		ResultSet r = p.executeQuery();
		LinkedList<Recenzja> l = new LinkedList<Recenzja>();
		while(r.next())
			l.add(new Recenzja(r.getLong(1)));
		r.close();
		p.close();
		return l;
	}

	static public Collection<FilmBean> getLista() throws SQLException
	{
		PreparedStatement p = getConnection().prepareStatement( "select punkty_ilosc_cache,punkty_suma_cache,rok_produkcji,id,tytul from FILM");
		ResultSet r = p.executeQuery();
		LinkedList<FilmBean> l = new LinkedList<FilmBean>();
		while(r.next())
			l.add(new FilmBean(r.getLong(1), r.getLong(2), r.getInt(3), r.getLong(4), r.getString(5)));
		r.close();
		p.close();
		return l;
	}
	
	public Collection<ObsadaBean> getObsada() throws SQLException {
		PreparedStatement p = getConnection()
				.prepareStatement(
						"select	czlowiek.imie imie,						" +
						"		czlowiek.id autorId,					" +
						"		film.id film_id,						" +
						"		obsadzil.stanowisko_id rolaId,			" +
						"		stanowisko.nazwa rola,					" +
						"		film.tytul tytulFilmu,					" +
						"		czlowiek.nazwisko nazwisko,				" +
						"		obsadzil.id id							" +
						"from	obsadzil, stanowisko, czlowiek, film 	" +
						"where	obsadzil.stanowisko_id = stanowisko.id	" +
						"	and	obsadzil.czlowiek_id = czlowiek.id		" +
						"	and	obsadzil.film_id = film.id				" +
						"	and	obsadzil.film_id  = ? ");
		p.setLong( 1, id );
		ResultSet r = p.executeQuery();
		LinkedList<ObsadaBean> out =  new LinkedList<ObsadaBean>();
		while(r.next()){ // kolejność: imie,autorId,film_id,rolaId,rola,tytulFilmu,nazwisko,id
			out.add( new ObsadaBean(
					r.getString(1),
					r.getLong(2),
					r.getLong(3),
					r.getLong(4),
					r.getString(5),
					r.getString(6),
					r.getString(7),
					r.getLong(8)));
		}
		r.close();
		p.close();
		return out;
	}
	
	public FilmBean get() throws SQLException  {
		PreparedStatement p = getConnection().prepareStatement( "select punkty_ilosc_cache,punkty_suma_cache,rok_produkcji,id,tytul from FILM where id  = ? ");
		p.setLong( 1, id );
		ResultSet r = p.executeQuery();
		if(r.next()){
			FilmBean f = new FilmBean(r.getLong(1), r.getLong(2), r.getInt(3), r.getLong(4), r.getString(5));
			r.close();
			p.close();
			return f;
		} else {
			r.close();
			p.close();
			return null;
		}
	}
	
	public Film(long _id) {
		id = _id;	
	}
	
	public Film(String tytul, int rok) throws SQLException {
		id = getNextSequence("seq_Film");
		PreparedStatement p = getConnection().prepareStatement(
				"insert into Film(id, tytul, rok_produkcji) "
						+ "values(?, ?, ?)");
		p.setLong(1, id);
		p.setString(2, tytul);
		p.setLong(3, rok);
		p.executeUpdate();
		p.close();
	}

	public void ocen(String kto, int ocena) throws SQLException {
		PreparedStatement p = getConnection().prepareStatement(
				"insert into OcenilFilm values(?, ?, ?)");
		p.setString(1, kto);
		p.setLong(2, id);
		p.setInt(3, ocena);
		p.executeUpdate();
		p.close();
	}

	public void edytujobsade(long czlowiek[], long stanowisko[]) throws SQLException {
		
		PreparedStatement p = getConnection().prepareStatement(
				"delete from Obsadzil where film_id = ?");
		p.setLong(1, id);
		p.executeUpdate();
		
		p = getConnection().prepareStatement(
				"insert into Obsadzil values(seq_Obsadzil.nextval, ?, ?, ?)");
		for (int x = 0; x < czlowiek.length && x < stanowisko.length; x++) {
			p.setLong(1, id);
			p.setLong(2, czlowiek[x]);
			p.setLong(3, stanowisko[x]);
			p.executeUpdate();
		}
		p.close();
	}
}
